package com.springboot2.validate.annotation;

import org.springframework.util.StringUtils;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * 自定义日期校验器
 */
public class DateTimeValidator implements ConstraintValidator<DateTime, String> {

    private DateTime dateTime;

    /**
     * 初始化，将注解对象初始化进来
     * @param constraintAnnotation 约束注解
     */
    @Override
    public void initialize(DateTime constraintAnnotation) {
        this.dateTime = constraintAnnotation;
    }

    /**
     * 进行约束验证的过程
     * @param value 待验证的值
     * @param constraintValidatorContext 约束执行的上下文环境
     * @return 是否验证通过
     */
    @Override
    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {

        if (null == value) {
            return true;
        }
        // 若设置格式为空，则验证失败
        if (StringUtils.isEmpty(dateTime.formatter())) {
            return false;
        }
        // 通过时间日期格式转换是否异常来判断格式是否正确
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateTime.formatter());
        try {
            simpleDateFormat.parse(value);
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
}
